import logging
from logging.handlers import RotatingFileHandler
import os
from datetime import datetime


def init_logging(log_file="system.log", level=logging.INFO):
    """设置主日志配置，按月份和分类组织"""
    # 获取当前年月
    now = datetime.now()
    year_month = now.strftime("%Y-%m")

    # 构建日志文件路径: logs/2024-06/app/system_2024-06-01.log
    full_log_file = f"logs/{year_month}/app/{log_file.split('/')[-1].replace('.log', '')}_{now.strftime('%Y-%m-%d')}.log"

    # 确保日志目录存在
    log_dir = os.path.dirname(full_log_file)
    if log_dir and not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # 创建主logger
    logger = logging.getLogger()
    logger.setLevel(level)

    # 避免重复添加处理器
    if not logger.handlers:
        # 创建文件处理器
        file_handler = RotatingFileHandler(
            full_log_file,
            maxBytes=10 * 1024 * 1024,  # 10MB
            backupCount=5,
            encoding="utf-8",  # 指定UTF-8编码
        )
        file_handler.setLevel(level)

        # 创建控制台处理器（可选）
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.WARNING)  # 只在控制台显示警告及以上级别

        # 创建格式器
        formatter = logging.Formatter(
            "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        )
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)

        # 添加处理器到logger
        logger.addHandler(file_handler)
        logger.addHandler(console_handler)

    return logger


def create_module_logger(module_category, module_name, level=logging.INFO):
    """为特定模块创建日志记录器
    Args:
        module_category: 模块分类 ('app' 或 'ws')
        module_name: 模块名称 ('system', 'plc', 'calibration' 等)
    """
    # 获取当前年月和日期
    now = datetime.now()
    year_month = now.strftime("%Y-%m")
    current_date = now.strftime("%Y-%m-%d")

    # 构建日志文件路径: logs/2024-06/ws/plc_2024-06-01.log
    log_file = f"logs/{year_month}/{module_category}/{module_name}_{current_date}.log"

    # 确保日志目录存在
    log_dir = os.path.dirname(log_file)
    if log_dir and not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # 创建模块专用logger
    logger = logging.getLogger(f"{module_category}.{module_name}")
    logger.setLevel(level)

    # 避免重复添加处理器
    if not logger.handlers:
        # 创建文件处理器
        file_handler = logging.FileHandler(log_file, encoding="utf-8")
        file_handler.setLevel(level)

        # 设置格式器
        formatter = logging.Formatter(
            "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        )
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)

    return logger


def get_daily_logger(module_category, module_name, level=logging.INFO):
    """获取按日期分割的日志记录器（如果当天已创建则复用）"""
    logger_name = f"{module_category}.{module_name}"
    logger = logging.getLogger(logger_name)

    # 如果logger还没有处理器，则创建新的
    if not logger.handlers:
        return create_module_logger(module_category, module_name, level)

    return logger


# 为PLC模块创建日志记录器
plc_logger = get_daily_logger("ws", "plc")

# 为校验仪模块创建日志记录器
calibration_logger = get_daily_logger("ws", "calibration")

# 为系统模块创建日志记录器
system_logger = get_daily_logger("app", "system")

__all__ = ["plc_logger", "calibration_logger", "system_logger"]
